#ifndef CONNECTMANAGER_H
#define CONNECTMANAGER_H

#include "util/baseobject.h"
#include <QSharedPointer>
#include <QThread>

#include "tcp/basetcp.h"
#include "thread/threadtasks.h"
#include "tcp/baseudp.h"

class HomeWindow;
class NetManager;
class AdpterManager;
class FormManager;

class ConnectManager : public BaseObject
{
    Q_OBJECT
public:
    explicit ConnectManager(HomeWindow* _homeWindow, QSharedPointer<FormManager> _formManager, QSharedPointer<AdpterManager> _adpManager, QObject *parent = nullptr);
    ~ConnectManager();

signals:
    /////////////////////////////////////////
    /// \brief leftConnectSignal
    /// \param ip
    /// \param port
    /// 左控制器 连接socket
    void leftConnectSignal(QString ip, int port);

    /////////////////////////////////////////
    /// \brief rightConnectSignal
    /// \param ip
    /// \param port
    /// 右控制器连接socket
    void rightConnectSignal(QString ip, int port);
    void readSignal(QString);

    void sendCommandSignal(const QString& cmd);

    void sendCommandSignal2000(const QString& cmd);
public slots:
    //virtual void onReadFromSocket(QByteArray ba) = 0;
    void connnectToNetSolts(QString address, int port);

public:
    //////////////////////////////////////////
    /// Interface
    void leftConnectToSocket(QString,int);
    void rightConnectToSocket(QString,int);

    ///////////////////////////////////////////
    /// \brief leftBaseTcp
    /// 左控制器任务
    QSharedPointer<BaseTcp> leftBaseTcp;
    QSharedPointer<ThreadTasks> leftThreadTasks;
    QSharedPointer<QThread> leftReceiveTask;

    ///////////////////////////////////////////
    /// 右控制器任务
    QSharedPointer<BaseTcp> rightBaseTcp;
    QSharedPointer<ThreadTasks> rightThreadTasks;
    QSharedPointer<QThread> rightReceiveTask;

    ///
    /// \brief homeWindow
    ///主窗口指针
    HomeWindow *homeWindow;

    QSharedPointer<FormManager> formManager;
    //////////////// 管理所有信号槽适配器 ////////////////
    QSharedPointer<AdpterManager> adpterManager;



    ///////////////////////////////////////////
    ///Function
    void initConnect();

    /*********************************************
    * @brief         摘要
    * @author        Charles
    * @date          2019-06-11
    * @function      发送网络接口命令
    *********************************************/
    void sendCommand(const QString& cmd);

    /*********************************************
    * @brief         摘要
    * @author        Charles
    * @date          2019-06-11
    * @function      发送网络接口命令
    *********************************************/
    void sendCommandTo2000(const QString& cmd);

private:
    //初始化网络连接和线程的信号槽。
    void initNetAndThreadConnect();

    /*********************************************
    * @brief         摘要
    * @author        Charles
    * @date          2019-06-03
    * @function      网络连接状态信号连接
    *********************************************/
    void initConnectNetAndStatus();

    /*********************************************
    * @brief         摘要
    * @author        Charles
    * @date          2019-06-11
    * @function      发送网络命令。
    *********************************************/
    void initSendCommandConnect();
};

#endif // CONNECTMANAGER_H
